1   /*
2    * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
3    * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4    *
5    * This code is free software; you can redistribute it and/or modify it
6    * under the terms of the GNU General Public License version 2 only, as
7    * published by the Free Software Foundation.
8    *
9    * This code is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12   * version 2 for more details (a copy is included in the LICENSE file that
13   * accompanied this code).
14   *
15   * You should have received a copy of the GNU General Public License version
16   * 2 along with this work; if not, write to the Free Software Foundation,
17   * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18   *
19   * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20   * or visit www.oracle.com if you need additional information or have any
21   * questions.
22   */
23  
24  /*
25   * @test
26   * @bug 6317101
27   * @summary Test that the jmx.invoke.getters system property works
28   * @author Eamonn McManus
29   * @run clean InvokeGettersTest
30   * @run build InvokeGettersTest
31   * @run main InvokeGettersTest
32   */
33  
34  import java.util.Arrays;
35  import javax.management.*;
36  
37  public class InvokeGettersTest {
38      public static interface ThingMBean {
39          public int getWhatsit();
40          public void setWhatsit(int x);
41          public boolean isTrue();
42      }
43  
44      public static class Thing implements ThingMBean {
45          public int getWhatsit() {
46              return whatsit;
47          }
48  
49          public void setWhatsit(int x) {
50              whatsit = x;
51          }
52  
53          public boolean isTrue() {
54              return true;
55          }
56  
57          private int whatsit;
58      }
59  
60      public static void main(String[] args) throws Exception {
61          MBeanServer mbs = MBeanServerFactory.newMBeanServer();
62          ObjectName on = new ObjectName("a:b=c");
63          mbs.registerMBean(new Thing(), on);
64          if (test(mbs, on, false))
65              System.out.println("OK: invoke without jmx.invoke.getters");
66          System.setProperty("jmx.invoke.getters", "true");
67          if (test(mbs, on, true))
68              System.out.println("OK: invoke with jmx.invoke.getters");
69          if (failure == null)
70              System.out.println("TEST PASSED");
71          else
72              throw new Exception("TEST FAILED: " + failure);
73      }
74  
75      private static boolean test(MBeanServer mbs, ObjectName on,
76                                  boolean shouldWork) throws Exception {
77          ++x;
78          mbs.setAttribute(on, new Attribute("Whatsit", x));
79          Integer got = (Integer) mbs.getAttribute(on, "Whatsit");
80          if (got != x)
81              return fail("Set attribute was not got: " + got);
82          ++x;
83          try {
84              mbs.invoke(on, "setWhatsit", new Object[] {x}, new String[] {"int"});
85              if (!shouldWork)
86                  return fail("invoke setWhatsit worked but should not have");
87              System.out.println("invoke setWhatsit worked as expected");
88          } catch (ReflectionException e) {
89              if (shouldWork)
90                  return fail("invoke setWhatsit did not work but should have");
91              System.out.println("set got expected exception: " + e);
92          }
93          try {
94              got = (Integer) mbs.invoke(on, "getWhatsit", null, null);
95              if (!shouldWork)
96                  return fail("invoke getWhatsit worked but should not have");
97              if (got != x)
98                  return fail("Set attribute through invoke was not got: " + got);
99              System.out.println("invoke getWhatsit worked as expected");
100         } catch (ReflectionException e) {
101             if (shouldWork)
102                 return fail("invoke getWhatsit did not work but should have");
103             System.out.println("get got expected exception: " + e);
104         }
105         try {
106             boolean t = (Boolean) mbs.invoke(on, "isTrue", null, null);
107             if (!shouldWork)
108                 return fail("invoke isTrue worked but should not have");
109             if (!t)
110                 return fail("isTrue returned false");
111             System.out.println("invoke isTrue worked as expected");
112         } catch (ReflectionException e) {
113             if (shouldWork)
114                 return fail("invoke isTrue did not work but should have");
115             else
116                 System.out.println("isTrue got expected exception: " + e);
117         }
118 
119         // Following cases should fail whether or not jmx.invoke.getters is set
120         final Object[][] badInvokes = {
121             {"isWhatsit", null, null},
122             {"getWhatsit", new Object[] {5}, new String[] {"int"}},
123             {"setWhatsit", new Object[] {false}, new String[] {"boolean"}},
124             {"getTrue", null, null},
125         };
126         boolean ok = true;
127         for (Object[] args : badInvokes) {
128             String name = (String) args[0];
129             Object[] params = (Object[]) args[1];
130             String[] sig = (String[]) args[2];
131             String what =
132                 "invoke " + name + (sig == null ? "[]" : Arrays.toString(sig));
133             try {
134                 mbs.invoke(on, name, params, sig);
135                 ok = fail(what + " worked but should not have");
136             } catch (ReflectionException e) {
137                 if (e.getCause() instanceof NoSuchMethodException)
138                     System.out.println(what + " failed as expected");
139                 else {
140                     ok = fail(what + " got exception with wrong nested " +
141                               "exception: " + e.getCause());
142                 }
143             }
144         }
145 
146         return ok;
147     }
148 
149     private static boolean fail(String why) {
150         failure = why;
151         System.out.println("FAILED: " + why);
152         return false;
153     }
154 
155     private static int x;
156     private static String failure;
157 }